#ifndef __WINOGRAD_4x4_TO_36_H
#define __WINOGRAD_4x4_TO_36_H

#include "operation.h"

namespace mslite {

class Winograd4x4To36: public Operation {
public:
    Winograd4x4To36(cl_context context, cl_device_id device, std::string clKernelName, std::vector<int> ishape);
    virtual ~Winograd4x4To36() = default;
    cl_int prepareMem(void) override;
    cl_int setParams(void) override;
    // cl_int getOutut(cl_command_queue commandQueue, std::vector<std::vector<float>> &output) override;
};

class Winograd4x4To36Naive: public Winograd4x4To36 {
public:
    Winograd4x4To36Naive(cl_context context, cl_device_id device, std::vector<int> ishape);
    virtual ~Winograd4x4To36Naive() = default;
    cl_int bind(void) override;
};

class Winograd4x4To36Tflite: public Winograd4x4To36 {
public:
    Winograd4x4To36Tflite(cl_context context, cl_device_id device, std::vector<int> ishape);
    virtual ~Winograd4x4To36Tflite() = default;
    cl_int bind(void) override;
};

class Winograd4x4To36Image2d: public Winograd4x4To36 {
public:
    Winograd4x4To36Image2d(cl_context context, cl_device_id device, std::vector<int> ishape);
    virtual ~Winograd4x4To36Image2d() = default;
    cl_int prepareMem(void) override;
    cl_int bind(void) override;
};


}

#endif